package database

import "sync" // 提供sync.Once，确保全局管理器仅初始化一次

/*
本文件实现了全局数据库管理器，通过单例模式（singleton）提供全局唯一的数据库管理器实例，
简化在应用任意模块中访问和操作数据库管理器的流程，避免多实例管理导致的资源混乱。
*/

var (
	globalManager *Manager  // 全局数据库管理器实例，整个应用共享一个
	once          sync.Once // 保证全局管理器仅被初始化一次（线程安全的单例初始化）
)

// GlobalManager 获取全局唯一的数据库管理器实例，使用单例模式确保全局只有一个管理器
// 返回值：
//
//	*Manager: 全局数据库管理器实例（首次调用时初始化，后续调用返回同一个实例）
func GlobalManager() *Manager {
	// sync.Once的Do方法确保传入的函数仅执行一次，无论多少goroutine同时调用
	once.Do(func() {
		globalManager = NewManager() // 初始化全局管理器（仅执行一次）
	})
	return globalManager // 返回全局实例
}

// AddDatabase 全局添加数据库实例（封装全局管理器的AddDatabase方法）
// 参数：
//
//	name: 数据库的唯一标识名称
//	db: 实现Database接口的数据库实例
//
// 返回值：
//
//	error: 调用全局管理器的AddDatabase方法的返回值（成功为nil，失败为具体错误）
func AddDatabase(name string, db Database) error {
	return GlobalManager().AddDatabase(name, db)
}

// GetDatabase 全局获取指定名称的数据库实例（封装全局管理器的GetDatabase方法）
// 参数：
//
//	name: 要获取的数据库的唯一标识名称
//
// 返回值：
//
//	Database: 对应的数据库实例（若存在）
//	error: 调用全局管理器的GetDatabase方法的返回值（成功为nil，失败如"未找到"）
func GetDatabase(name string) (Database, error) {
	return GlobalManager().GetDatabase(name)
}

// RemoveDatabase 全局移除指定名称的数据库实例（封装全局管理器的RemoveDatabase方法）
// 参数：
//
//	name: 要移除的数据库的唯一标识名称
//
// 返回值：
//
//	error: 调用全局管理器的RemoveDatabase方法的返回值（成功为nil，失败为具体错误）
func RemoveDatabase(name string) error {
	return GlobalManager().RemoveDatabase(name)
}

// CloseAllDatabase 全局关闭所有数据库连接（封装全局管理器的CloseAllDatabase方法）
// 返回值：
//
//	error: 调用全局管理器的CloseAllDatabase方法的返回值（成功为nil，失败为最后一个错误）
func CloseAllDatabase() error {
	return GlobalManager().CloseAllDatabase()
}

// PingAllDatabase 全局检查所有数据库连接（封装全局管理器的PingAllDatabase方法）
// 返回值：
//
//	map[string]error: 调用全局管理器的PingAllDatabase方法的返回值（每个数据库的连接状态）
func PingAllDatabase() map[string]error {
	return GlobalManager().PingAllDatabase()
}
